package com.zjsru.plan2025.oneday;

import java.util.HashMap;
import java.util.Map;

/**
 * 2944. 购买水果需要的最少金币数
 *
 * @Author: cookLee
 * @Date: 2025-01-24
 */
public class MinimumCoins {

    /**
     * 主
     * \
     * 如果你花费 prices[i] 购买了下标为 i 的水果，那么你可以免费获得下标范围在 [i + 1, i + i] 的水果
     * \
     * 输入：prices = [3,1,2]
     * <p>
     * 输出：4
     * <p>
     * 解释：
     * <p>
     * 用 prices[0] = 3 个金币购买第 1 个水果，你可以免费获得第 2 个水果。
     * 用 prices[1] = 1 个金币购买第 2 个水果，你可以免费获得第 3 个水果。
     * 免费获得第 3 个水果。
     * 请注意，即使您可以免费获得第 2 个水果作为购买第 1 个水果的奖励，但您购买它是为了获得其奖励，这是更优化的。
     * \
     *
     * @param args args
     */
    public static void main(String[] args) {
        MinimumCoins minimumCoins = new MinimumCoins();
        int[] prices = new int[]{3, 1, 2};
        System.out.println(minimumCoins.minimumCoins(prices));
    }

    private Map<Integer, Integer> map = new HashMap<>();
    private int[] prices;

    /**
     * 最低硬币
     *
     * @param prices 价格
     * @return int
     */
    public int minimumCoins(int[] prices) {
        this.prices = prices;
        //下标从1开始
        return this.helper(0);
    }

    private int helper(int count) {
        if (2 * (count + 1) >= this.prices.length) {
            return this.prices[count];
        }
        if (!this.map.containsKey(count)) {
            int minValue = Integer.MAX_VALUE;
            for (int i = count + 1; i <= 2 * (count + 1); i++) {
                minValue = Math.min(minValue, this.helper(i));
            }
            this.map.put(count, this.prices[count] + minValue);
        }
        return this.map.get(count);
    }

}
